import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Combinations {
    /*
    * 77. 组合
    * 给定两个整数 n 和 k，返回范围 [1, n] 中所有可能的 k 个数的组合。
    * 你可以按 任何顺序 返回答案。
    *
    * 1 <= n <= 20
    * 1 <= k <= n
    * */
    public static void main(String[] args){
        Combinations o = new Combinations();
        o.mySolution(4, 2);
    }

    // 我的想法：肯定不能死写for循环，k等于100就得套100个，想想都头疼，
    // 回溯递归
    public List<List<Integer>> mySolution(int n, int k){
        for (int i = 1; i <= n - k + 1; i++) {
            LinkedList<Integer> r = new LinkedList<>();
            r.add(i);
            backtracking(n, k-1, i+1, r);
        }
        return res;
    }
    ArrayList<List<Integer>> res = new ArrayList<>();
    private void backtracking(int n, int len,  int start, List<Integer> r){
        if(len == 0){
            ArrayList<Integer> list = new ArrayList<>(r);
            res.add(list);
            return;
        }
        for (int i = start; i <= n - len + 1; i++) {
            r.add(i);
            backtracking(n, len-1, i+1, r);
            r.remove(r.size()-1);
        }
    }

    
}
